"""
    python面向对象入门和进阶
"""


class Person:
    def __init__(self, name, age, degree):
        self.name = name
        self.age = age
        self.degree = degree

    def excercise(self, way):
        print(f"每天下班{way}运动")

    # 定义类方法需要使用装饰器@classmethod
    # 可以定义一个类方法，默认的第一个必带参数是cls：代表类本身
    @classmethod
    def fang_da_zhao(cls):
        print("开始施法大招")

    @staticmethod
    def staticFunc():  # 静态方法没有默认必带参数，跟函数相似
        print("我是静态函数")


cuiyouyuan = Person("崔优媛", 27, "本科")
print(cuiyouyuan.name)
print(cuiyouyuan.age)
print(cuiyouyuan.degree)
cuiyouyuan.excercise("跑步")

# 类方法的使用
# 通过对象名.类方法名()
cuiyouyuan.fang_da_zhao()
# 类名.类方法名()
Person.fang_da_zhao()

# 静态方法，对象和类都可以使用
cuiyouyuan.staticFunc()
Person.staticFunc()


class A:
    def e(self):
        print("调用了A类的实例方法e")


class B:
    def e(self):
        print("调用了B类的实例方法e")


# class C(B, A):
class C(A, B):
    pass


# 使用魔法属性或魔法方法查看继承的先后顺序
print(C.mro())  # [<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
# 按照C继承的顺序来的，如果写C(A,B),那就是[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
# 如果写成C(B, A),那就是[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]

